package io.renren.service.impl;

import io.renren.dao.CountDao;
import io.renren.entity.Count;
import io.renren.utils.RRException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import io.renren.dao.ZanDao;
import io.renren.entity.Zan;
import io.renren.service.ZanService;
import org.springframework.transaction.annotation.Transactional;


@Service("zanService")
@Slf4j
public class ZanServiceImpl implements ZanService {
    @Resource
    private ZanDao zanDao;

    @Resource
    private CountDao countDao;

    @Override
    public Zan queryObject(Long userId) {
        return zanDao.queryObject(userId);
    }

    @Override
    public List<Zan> queryList(Map<String, Object> map) {
        return zanDao.queryList(map);
    }

    @Override
    public int queryTotal(Map<String, Object> map) {
        return zanDao.queryTotal(map);
    }

    @Override
    public void save(Zan zan) {
        zanDao.save(zan);
    }

    @Override
    public void update(Zan zan) {
        zanDao.update(zan);
    }

    @Override
    public void delete(Long userId) {
        zanDao.delete(userId);
    }

    @Override
    public void deleteBatch(Long[] userIds) {
        zanDao.deleteBatch(userIds);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateZans(Long userId, Long videoId, String status) {

        //1. 修改点赞记录
        //1.1 查看是否存在记录
        log.debug("更新日志开始==========================>");
        Map query = new HashMap();
        query.put("userId", userId);
        query.put("videoId", videoId);
        List<Zan> zans = zanDao.queryList(query);
        log.debug("查询自己的点赞信息： {}",zans);
        //1.2如果不存在该记录，并且为添加，则添加记录
        if (zans == null || zans.size() == 0) {
            if ("0".equals(status)) {
                //如果没有值，还为取消点赞则直接返回
                log.debug("status: "+status);
                return;
            }

            log.debug("status: "+status);
            query.put("status", "1");
            zanDao.save(query);
            log.debug("个人点赞信息保存成功");
        } else {
            log.debug("更新个人点赞信息");
            if (zans.get(0).getStatus().equals(status)) {
                //1.3如果存在该记录则判断是否和原始值相同，如果相同则直接返回
                log.debug("数据库和传递过来的status相同");
                return;
            }
            //1.4不同，则更新点赞状态
            log.debug("两个状态不同则更新，参数状态{},数据库状态{}",status,zans.get(0).getStatus());
            query.put("status", status);
            zanDao.update(query);
            log.debug("更新成功");
        }

        //2. 修改总数量
        //2.1 查询是否存在【锁表】
        Count count = countDao.selectObject(videoId);
        log.debug("数据库点赞总数量为：{}",count);
        Map countMap = new HashMap();
        countMap.put("id",videoId);
        //2.2 如果不存在则创建
        if(count == null){
            log.debug("数据库不存在该视频的总点赞数");
            countMap.put("zan",1);
            countMap.put("viewNumber",0);
            countDao.save(countMap);
            log.debug("添加总点赞成功");
        }else {
            log.debug("存在count，进行更新");
            //2.3 如果存在，则更新
            if(status.equals("1")){
                log.debug("状态为1：进行添加");
                countDao.updateAdd(countMap);
            }else{
                if(count.getZan() <= 0){
                    log.debug("总数据为0 不能进行减操作");
                   throw new RRException("总数据为0，不能进行减操作");
                }
                log.debug("状态为0，进行减");
                countDao.updateSub(countMap);
            }
        }
    }

}
